#include<reg51.h>
#define uchar unsigned char
uchar num, sec;

void main()
{
	TMOD=0x01;
	TH0=(65536-50000)/256;
	TL0=(65536-50000)%256;
	
	EA=1; //CPU中断允许总控制位
	ET0=1; //定时/计数器T0中断允许位
	TR0=1; //启动定时/计数器T0

	while(1)
	{
		if(sec<=20) //0s~20s：绿灯点亮20秒，正常通行
			P1=0xfb;
		if((sec>20)&&(sec<=30))//20s~30s：绿灯闪烁10秒，警告
		{
			if(num==0)
				P1=0xff; //灭灯0.5s
			if(num==10)
				P1=0xfb; //亮灯0.5s
		}
		if((sec>30)&&(sec<=33))//30s~33s：黄灯点亮3秒，警告
			P1=0xfd;
		if((sec>35)&&(sec<=65))//33s~63s：红灯点亮30秒，禁止通行
			P1=0xfe;
		if(sec==63)
			sec=0; //0s~63s,重复循环
	}
}

void time0() interrupt 1 //定时/计数器T0
{
	TH0=(65536-50000)/256;
	TL0=(65536-50000)%256;
	num++;
	if(num==20) // 20*50ms=1s
	{
		sec++; //累加1秒
		num=0;
	}
}